package com.example.image.util

import android.content.res.Resources
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Matrix
import com.example.image.BuildConfig
import java.io.ByteArrayOutputStream

/**
 * 压缩方式:大小,质量,缩放,编码格式,矩阵,采样
 */
object BitmapUtil {
    /**
     * 质量压缩
     */
    fun compressQuality(resources:Resources,resId:Int, quality:Int):Bitmap {
        //从资源文件中解析图片
        var bm = BitmapFactory.decodeResource(resources, resId)
        var bmos = ByteArrayOutputStream()
        //把图片压缩到输出流中
        bm.compress(Bitmap.CompressFormat.JPEG, 100, bmos)
        //从流中解析图片
        var newBitmap=BitmapFactory.decodeByteArray(bmos.toByteArray(), quality, bmos.toByteArray().size)
        //回收资源
        bm.recycle()
        bmos.close()
        return newBitmap
    }
    /**
     * 矩阵压缩
     */
    fun compressMatrixBitmap(resources:Resources,resId:Int, sx:Float,sy:Float):Bitmap{
        //创建矩阵Matrix
        var bitmapMatrix=Matrix().apply {
            setScale(sx,sy)
        }
        //加载资源图片
        var bm=BitmapFactory.decodeResource(resources,resId)
        //创建信的Bitmap
        var newBitmap=Bitmap.createBitmap(bm,0,0,bm.width,bm.height,bitmapMatrix,true)
        //释放资源
        bm.recycle()
        return newBitmap
    }
    /**
     * 编码格式压缩
     *计算图片占内存大小：宽*高*每个像素占的字节大小
     * ARGB_8888: 占32位，4个字节
     * RGB_565:   占16位，2个字节
     * ALPHA_8:   占8位，1个字节
     * RGBA_F16:  占64位，8个字节
     * ARGB_4444: 占16位，2个字节
     */
    fun compressEncodeFormatBitmap(resources:Resources,resId:Int,config: Bitmap.Config=Bitmap.Config.RGB_565):Bitmap{
        var options=BitmapFactory.Options().apply {
            inPreferredConfig=config
        }
        return BitmapFactory.decodeResource(resources,resId,options)
    }
    /**
     * 缩放压缩
     */
    fun compressScaleBitmap(resources:Resources,resId:Int, dsW:Int,dsH:Int):Bitmap{
        //加载图片视频
        var bm=BitmapFactory.decodeResource(resources,resId)
        var newBitmap=Bitmap.createScaledBitmap(bm,dsW,dsH,true)
        bm.recycle()
        return newBitmap
    }
    /**
     * 二次采样
     */
    fun compressSampleSizeBitmap(resources:Resources,resId:Int,maxW:Int,maxH:Int):Bitmap{
        var sampleSize=1//默认1
        //创建加载参数
        var options=BitmapFactory.Options().apply {
            inJustDecodeBounds=true//表示只加载图片的大小，不会加载图片的像素点
        }
        //第一次加载获取图片宽高
        var bm=BitmapFactory.decodeResource(resources,resId,options)
        //获取图片宽高
        var bmW=options.outWidth
        var bwH=options.outHeight
        //计算缩放比
        while(bmW>maxW||bwH>maxH) {
            sampleSize *=2//采样率大小增加2倍
            //重新计算宽高
            bmW/=sampleSize
            bwH/=sampleSize
        }
        //加载图片的像素
        options.inJustDecodeBounds=false//表示加载图片的像素点
        options.inSampleSize=sampleSize//设置采样率
        var newbm=BitmapFactory.decodeResource(resources,resId,options)
        bm.recycle()
        return newbm
    }
}